Current File : /home/jeconsul/public_html/wp-content/plugins/suremails/src/screens/logs/email-log-drawer.js
// EmailLogDrawer.js
import { useState } from '@wordpress/element';
import { Container, Drawer, toast, Button } from '@bsf/force-ui';
import ConfirmationDialog from '@components/confirmation-dialog/confirmation-dialog'; // Import ConfirmationDialog
import { resendEmails } from '@api/logs'; // Import resendEmails function
import { __ } from '@wordpress/i18n';
import DrawerLogBody from './drawer-log-body';
import { Redo2, LoaderCircle as LoaderIcon } from 'lucide-react';
import { get_pending_status } from '@utils/utils';

const EmailLogDrawer = ( {
	log,
	isOpen,
	setOpen,
	onClose,
	onResendSuccess,
} ) => {
	// State for Confirmation Dialog
	const [ isDialogOpen, setIsDialogOpen ] = useState( false );
	const [ dialogConfig, setDialogConfig ] = useState( {
		title: '',
		description: '',
		onConfirm: null,
		confirmButtonText: '',
	} );

	// Loading state for Resend button
	const [ isLoading, setIsLoading ] = useState( false );

	const handleSetOpen = ( open ) => {
		setOpen( open );
		if ( ! open && onClose ) {
			onClose();
		}
	};

	// Handler to open confirmation dialog
	const handleResendClick = () => {
		setDialogConfig( {
			title: __( 'Confirm Resend', 'suremails' ),
			description: __(
				'Are you sure you want to resend this email?',
				'suremails'
			),
			onConfirm: handleResendConfirm,
			confirmButtonText: __( 'Resend', 'suremails' ),
		} );
		setIsDialogOpen( true );
	};

	// Function to get confirm button text (if needed)
	const getConfirmButtonText = () => {
		return dialogConfig.confirmButtonText || __( 'Confirm', 'suremails' );
	};

	const handleResendConfirm = async () => {
		setIsDialogOpen( false );
		setIsLoading( true );
		try {
			const data = await resendEmails( [ log.id ] );
			if ( data.success ) {
				toast.success(
					__( 'Email resent successfully.', 'suremails' )
				);
			} else {
				toast.error( __( 'Failed to resend the email.', 'suremails' ), {
					description:
						data.message ||
						__(
							'There was an issue resending emails.',
							'suremails'
						),
				} );
			}
		} catch ( error ) {
			toast.error( __( 'Failed to resend the email.', 'suremails' ), {
				description:
					error.message ||
					__( 'There was an issue resending emails.', 'suremails' ),
			} );
		} finally {
			setIsLoading( false );
			// Trigger refetch of the log even if the request failed.
			onResendSuccess();
		}
	};

	return (
		<>
			<Drawer
				design="simple"
				exitOnEsc
				position="right"
				scrollLock
				setOpen={ handleSetOpen }
				transitionDuration={ 0.2 }
				open={ isOpen }
				className="w-[752px] z-999999"
			>
				<Drawer.Panel className="w-[752px]">
					<Drawer.Header>
						<div className="flex items-center justify-between text-base font-semibold gap-3">
							<Container justify="between" className="w-full">
								<Drawer.Title>
									{ __( 'Email Log', 'suremails' ) }
								</Drawer.Title>
								<Button
									className="py-0.5 font-semibold"
									iconPosition="left"
									size="xs"
									variant="primary"
									icon={
										isLoading ? (
											<LoaderIcon className="mr-2 animate-spin" />
										) : (
											<Redo2 />
										)
									}
									onClick={ handleResendClick } // Updated onClick handler
									loading={ isLoading } // Add loading prop
									disabled={ get_pending_status(
										log?.status
									) }
								>
									{ __( 'Resend', 'suremails' ) }
								</Button>
							</Container>
							<Drawer.CloseButton />
							{ /* Use the handler */ }
						</div>
					</Drawer.Header>

					{ /* Render DrawerLogBody and pass log as a prop */ }
					<Drawer.Body className="space-y-4 overflow-x-hidden pb-10">
						<DrawerLogBody log={ log } />
					</Drawer.Body>
				</Drawer.Panel>
				<Drawer.Backdrop />
			</Drawer>
			{ /* Confirmation Dialog */ }
			<ConfirmationDialog
				isOpen={ isDialogOpen }
				title={ dialogConfig.title }
				description={ dialogConfig.description }
				onConfirm={ dialogConfig.onConfirm }
				onCancel={ () => setIsDialogOpen( false ) }
				confirmButtonText={ getConfirmButtonText() }
				cancelButtonText={ __( 'Cancel', 'suremails' ) }
				destructiveConfirmButton={ false }
			/>
		</>
	);
};

export default EmailLogDrawer;